function avoidFlood(rains) {
  const n = rains.length;
  const ans = new Array(n).fill(-1);
  // 记录每个湖泊上次下雨的日期
  const lastRain = new Map();
  // 存储可用的抽水日索引（rains[i] = 0的日子）
  const zeros = [];

  for (let i = 0; i < n; i++) {
    const lake = rains[i];
    if (lake > 0) {
      // 这是一个下雨的日子
      if (lastRain.has(lake)) {
        // 这个湖泊之前下过雨，需要找到一个抽水日
        const lastDay = lastRain.get(lake);
        let found = false;

        // 在可用的抽水日中找到第一个在lastDay之后的日子
        for (let j = 0; j < zeros.length; j++) {
          const zeroDay = zeros[j];
          if (zeroDay > lastDay) {
            // 用这个日子抽干当前湖泊
            ans[zeroDay] = lake;
            // 从可用抽水日中移除
            zeros.splice(j, 1);
            found = true;
            break;
          }
        }

        // 如果找不到合适的抽水日，会发生洪水
        if (!found) {
          return [];
        }
      }
      // 更新该湖泊最后一次下雨的日期
      lastRain.set(lake, i);
    } else {
      // 这是一个抽水日，先记录下来
      zeros.push(i);
    }
  }

  // 处理剩余的抽水日，可以抽干任意湖泊（这里选择1，抽干空湖泊也没关系）
  for (const day of zeros) {
    ans[day] = 1;
  }

  return ans;
}

// 测试案例
console.log(avoidFlood([1, 2, 3, 4])); // [-1,-1,-1,-1]
console.log(avoidFlood([1, 2, 0, 0, 2, 1])); // [-1,-1,2,1,-1,-1] 或其他有效解
console.log(avoidFlood([1, 2, 0, 1, 2])); // []
